From 875a8aba7916b63c3c8464008a271f6082e23779 Mon Sep 17 00:00:00 2001 From: Ewan Higgs Date: Wed, 17 Aug 2016 01:58:05 +0200 Subject: [PATCH] Cargo templating for `new` and `init` PR #3004 This is a resubmission of the PR #1747 (from scratch) which adds support for templating in Cargo. The templates are implemented using the handlebars crate (where the original PR used mustache). Examples: cargo new --template https://url/to/template somedir foo cargo new --template https://url/to/templates --template-subdir somedir foo cargo new --template ../path/to/template somedir foo --- Cargo.lock | 33 ++++ Cargo.toml | 2 + src/bin/init.rs | 16 +- src/bin/new.rs | 16 +- src/cargo/lib.rs | 1 + src/cargo/ops/cargo_new.rs | 294 ++++++++++++++++++++++++--------- src/cargo/sources/git/mod.rs | 2 +- src/cargo/sources/git/utils.rs | 18 ++ src/cargo/util/errors.rs | 8 + src/cargo/util/mod.rs | 1 + src/cargo/util/paths.rs | 5 + src/cargo/util/template.rs | 238 ++++++++++++++++++++++++++ src/doc/guide.md | 89 ++++++++++ src/etc/_cargo | 1 + src/etc/cargo.bashcomp.sh | 2 +- tests/new.rs | 71 +++++++- 16 files changed, 713 insertions(+), 84 deletions(-) create mode 100644 src/cargo/util/template.rs diff --git a/Cargo.lock b/Cargo.lock index 1f5d9b9e8..1ed69cc0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,7 @@ dependencies = [ "git2-curl 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "hamcrest 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "handlebars 0.20.5 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "libgit2-sys 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -236,6 +237,19 @@ dependencies = [ "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "handlebars" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pest 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.21 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "idna" version = "0.1.0" @@ -255,6 +269,11 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lazy_static" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "lazy_static" version = "0.2.2" @@ -453,6 +472,11 @@ dependencies = [ "user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "pest" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "pkg-config" version = "0.3.8" @@ -467,6 +491,11 @@ dependencies = [ "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "quick-error" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "rand" version = "0.3.14" @@ -651,8 +680,10 @@ dependencies = [ "checksum git2-curl 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "68676bc784bf0bef83278898929bf64a251e87c0340723d0b93fa096c9c5bf8e" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum hamcrest 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bf088f042a467089e9baa4972f57f9247e42a0cc549ba264c7a04fbb8ecb89d4" +"checksum handlebars 0.20.5 (registry+https://github.com/rust-lang/crates.io-index)" = "07f9c1d28bcfb97143c95ed0667141677b2b5675c7ba3d5b81459ad43b1073bd" "checksum idna 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1053236e00ce4f668aeca4a769a09b3bf5a682d802abd6f3cb39374f6b162c11" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "cf186d1a8aa5f5bee5fd662bc9c1b949e0259e1bcc379d1f006847b0080c7417" "checksum lazy_static 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6abe0ee2e758cd6bc8a2cd56726359007748fbf4128da998b65d0b70f881e19b" "checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70" "checksum libgit2-sys 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "502e50bcdcfa98df366bdd54935bff856f4cf11f725daa608092c0288205887a" @@ -675,8 +706,10 @@ dependencies = [ "checksum openssl 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1eb2a714828f5528e4a24a07c296539216f412364844d61fe1161f94558455d4" "checksum openssl-probe 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "756d49c8424483a3df3b5d735112b4da22109ced9a8294f1f5cdf80fb3810919" "checksum openssl-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "95e9fb08acc32509fac299d6e5f4932e1e055bb70d764282c3ed8beaa87ab0e9" +"checksum pest 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0a6dda33d67c26f0aac90d324ab2eb7239c819fc7b2552fe9faa4fe88441edc8" "checksum pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8cee804ecc7eaf201a4a207241472cc870e825206f6c031e3ee2a72fa425f2fa" "checksum psapi-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "abcd5d1a07d360e29727f757a9decb3ce8bc6e0efa8969cfaad669a8317a2478" +"checksum quick-error 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0aad603e8d7fb67da22dbdf1f4b826ce8829e406124109e73cf1b2454b93a71c" "checksum rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2791d88c6defac799c3f20d74f094ca33b9332612d9aef9078519c82e4fe04a5" "checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f" "checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957" diff --git a/Cargo.toml b/Cargo.toml index 54ca09385..906ef725d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,9 +28,11 @@ fs2 = "0.3" git2 = "0.6" git2-curl = "0.7" glob = "0.2" +handlebars = "0.20" libc = "0.2" libgit2-sys = "0.6" log = "0.3" +miow = "0.1" num_cpus = "1.0" regex = "0.1" rustc-serialize = "0.3" diff --git a/src/bin/init.rs b/src/bin/init.rs index 336ebe387..53cb8f073 100644 --- a/src/bin/init.rs +++ b/src/bin/init.rs @@ -12,6 +12,8 @@ pub struct Options { flag_lib: bool, arg_path: Option, flag_name: Option, + flag_template_subdir: Option, + flag_template: Option, flag_vcs: Option, flag_frozen: bool, flag_locked: bool, @@ -32,6 +34,8 @@ Options: --bin Use a binary (application) template --lib Use a library template --name NAME Set the resulting package name + --template Use a specified template repository + --template-subdir